注意:所有文章除特别说明外,转载请注明出处.
Runnable接口和Callable接口的区别
Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已。Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。
提示:这里Callable+Future/FutureTask可以获取多线程运行的结果,可以在等待时间太长没获取到需要的数据的情况下取消该线程的任务,真的是非常有用。
线程安全
线程安全表示程序在多线程下执行和在单线程下执行永远都能获得一样的结果,那么程序就是线程安全的。
线程安全级别
1.不可变 final类型的类,任何线程都不能改变它们的值,除非新建一个。
2.绝对线程安全
...
在两线程之间共享数据
通过在线程之间共享对象就可以了,然后通过wait/notify/notifyAll、await/signal/signalAll进行唤起和等待,比方说阻塞队列BlockingQueue就是为线程之间共享数据而设计的。
sleep()方法与wait()方法
sleep方法和wait方法都可以用来放弃CPU一定的时间,不同点在于如果线程持有某个对象的监视器,sleep方法不会放弃这个对象的监视器,wait方法会放弃这个对象的监视器。
生产者消费者模型
1.通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用。
2.解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系少,联系越少越可以独自发展而不需要收到相互的制约。
ThreadLocal作用
简单说ThreadLocal就是一种以空间换时间的做法,在每个Thread里面维护了一个以开地址法实现的ThreadLocal.ThreadLocalMap,把数据进行隔离,数据不共享,自然就没有线程安全方面的问题了。
乐观锁和悲观锁
1.乐观锁
乐观锁表示对于并发间操作产生的线程安全问题持乐观状态,乐观锁认为竞争不总是会发生,因此它不需要持有锁,将比较-设置这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,那么就应该有相应的重试逻辑。
2.悲观锁
悲观锁表示对于并发间操作产生的线程安全问题持悲观状态,悲观锁认为竞争总是会发生,因为每次对资源的操作都会持有一个独占的锁,就像synchronized。不管其它,直接上锁操作资源。